/**
    Generator函数
    概念：
      1、ES6提供的解决异步编程的方案之一
      2、Generator函数是一个状态机，内部封装了不同状态的数据，
      3、用来生成遍历器对象
      4、可暂停函数(惰性求值), yield可暂停，next方法可启动。每次返回的是yield后的表达式结果
    特点：
      1、function 与函数名之间有一个星号
      2、内部用yield表达式来定义不同的状态
      例如：
        function* generatorExample(){
          let result = yield 'hello';  // 状态值为hello
          yield 'generator'; // 状态值为generator
        }
      3、generator函数返回的是指针对象(接11章节里iterator)，而不会执行函数内部逻辑
      4、调用next方法函数内部逻辑开始执行，遇到yield表达式停止，返回{value: yield后的表达式结果/undefined, done: false/true}
      5、再次调用next方法会从上一次停止时的yield处开始，直到最后
      6、yield语句返回结果通常为undefined， 当调用next方法时传参内容会作为启动时yield语句的返回值。
 */

 function* generatorTest() {
   console.log('函数开始执行')
   yield 'hello'
   console.log('函数暂停后再次启动')
   yield 'generator'
 }
 // 生成遍历器对象
 let GT = generatorTest()
 // 执行函数，遇到yield后即暂停
 console.log(GT) // 遍历器对象
 let result = GT.next() // 函数执行,遇到yield暂停
 console.log(result) // {value: "hello", done: false}
 result = GT.next() //再次启动
 console.log(result) // {value: 'generator', done: false}
 result = GT.next();
 console.log(result); // {value: undefined, done: true}表示函数内部状态已经遍历完毕

 // 对象的Symbol.iterator属性
 let myIterable = {}
 myIterable[Symbol.iterator] = function* () {
   yield 1;
   yield 2;
   yield 3;
 }
 for(let item of myIterable) {
   console.log(item)
 }
 let obj = [...myIterable]
console.log(obj)

  /*
    * 需求：
    * 1、发送ajax请求获取新闻内容
    * 2、新闻内容获取成功后再次发送请求，获取对应的新闻评论内容
    * 3、新闻内容获取失败则不需要再次发送请求。
    * 
    * */
 function* sendXml() {
   // url为next传参进来的数据
   let url = yield getNews('/comment/1')
   yield console.log(url)
   
 }
 function getNews(commentsUrl) {
   setTimeout(()=> {
    let url = 'http://localhost:3000' + commentsUrl
    // 当获取新闻内容成功，发送请求获取对应的评论内容
    // 调用next传参会作为上次暂停是yield的返回值
    sx.next(url)
   }, 1000)
 }

 let sx = sendXml()
 sx.next()


 function* sendXml() {
  // url为next传参进来的数据
  let url = yield getNews('http://localhost:3000/news?newsId=2')
  yield getNews(url);
}
function getNews(url) {
  $.get(url, function (data) {
    console.log(data)
    let commentsUrl = data.commentsUrl
    let url = 'http://localhost:3000' + commentsUrl
    // 当获取新闻内容成功，发送请求获取对应的评论内容
    // 调用next传参会作为上次暂停是yield的返回值
    sx1.next(url)
  })
}

let sx1 = sendXml()
// 发送请求获取新闻内容
sx1.next();